// ProjectName: go-learn-demo
// PackageName: interybxb
// Description: 测试空接口
// Author: hy.bai
// Date: 2025-07-30 10:44

package interybxb

import "fmt"

// 空接口:没有定义任何方法签名(方法名、参数列表、返回值列表)的接口是空接口。空接口可以存储任何类型的值。

// 比如：如果abc是int类型，则需要把abc转换成int类型，才能使用int类型相关的特性。
func showInfo(abc interface{}) {

	fmt.Printf("abc的类型是%T,值是%v\n", abc, abc)
}

func DefineEmptyInterface() {
	// 声明一个空接口
	var inter interface{}
	inter = 12
	// inter = "abc"
	fmt.Printf("空接口的类型是:%T,值是:%v\n", inter, inter)
	// 空接口的类型是:<nil>,值是:<nil>
	// 空接口的类型是:int,值是:12
	// 空接口的类型是:string,值是:abc
}

func TestEmptyInterface() {

	var sInt = []int{1, 2, 3}
	fmt.Println(sInt)

	showInfo(123)                           // abc的类型是int,值是123
	showInfo("abcdef")                      // abc的类型是string,值是abcdef
	showInfo([]string{"aaa", "bbb", "ccc"}) // abc的类型是[]string,值是[aaa bbb ccc]
}

func TestEmptyInterfaceSlice() {
	var sInter = []interface{}{"abc", 123, true}
	for index, element := range sInter {
		fmt.Printf("索引:%v,元素的类型是：%T, 元素值是:%v\n", index, element, element)
	}
}
func TestEmptyInterfaceMap() {
	var emptyInterMap = map[string]interface{}{}
	emptyInterMap["username"] = "ybxb"
	emptyInterMap["age"] = 18
	emptyInterMap["married"] = true
	for key, value := range emptyInterMap {
		fmt.Printf("键是:%v,值的类型是%T,值是%v\n", key, value, value)
	}
}

// 接口断言
func DefineEmptyInterfaceAssert() {
	// 声明一个空接口
	var inter interface{}
	// inter = 12
	inter = "abc"
	fmt.Printf("空接口的类型是:%T,值是:%v\n", inter, inter)
	value, ok := inter.(int) // 把空接口类型转换成int或string类型
	if ok {                  // 如果是字符串类型，ok为true，否则为false
		fmt.Printf("断言结果ok类型是:%T,值是:%v\n", ok, ok)
		fmt.Printf("断言结果value类型是:%T,值是:%v\n", value, value)
	} else {
		fmt.Println("非int类型")
	}
}
